package cl.ccs.migracionbcmc.dao.impl;


import cl.ccs.migracionbcmc.connection.ConnectionFactory;
import cl.ccs.migracionbcmc.dao.AuditoriaProtestosDao;
import cl.ccs.migracionbcmc.model.AuditoriaGlosaCantidad;
import cl.ccs.migracionbcmc.model.AuditoriaProtestos;
import cl.ccs.migracionbcmc.model.RutNombre;

import cl.ccs.migracionbcmc.util.Util;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;

import java.sql.Timestamp;
import java.sql.Types;


import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;


public class AuditoriaProtestosDaoImpl implements AuditoriaProtestosDao {
    public AuditoriaProtestosDaoImpl() {
        super();
    }

    /**
     * @param fechaDesde
     * @param fechaHasta
     * @param isValid
     * @return
     * @throws Exception
     */
    @Override
    public List<AuditoriaProtestos> getAuditoriaProtestos(Date fechaDesde, Date fechaHasta, Boolean isValid) throws Exception {
        
        if(isValid == null || !isValid) {
            return Collections.emptyList();
        }

        Connection con = null;
        ResultSet rs = null;
        List<AuditoriaProtestos> result = new ArrayList<AuditoriaProtestos>();
        try{
            con = ConnectionFactory.getConnectionSybaseBIC();
            CallableStatement stm = con.prepareCall("{?=CALL SQ_ConsultaBCMC2_VsNet(?,?,?)}");
            stm.registerOutParameter(1, Types.INTEGER);
            
            stm.setTimestamp(2, new Timestamp(fechaDesde.getTime()));
            stm.setTimestamp(3, new Timestamp(fechaHasta.getTime()));
            
            stm.registerOutParameter(4, Types.VARCHAR);
            
            rs = stm.executeQuery();
            
            while(rs.next()) {
                AuditoriaProtestos auditoria = new AuditoriaProtestos();
                auditoria.setUsuario(rs.getString("Fld_CodUsuario"));
                auditoria.setNombre(rs.getString("Fld_Nombre"));
                auditoria.setCantidad(rs.getInt("Fld_Cantidad"));
                result.add(auditoria); 
            } 
            
            /*
            //DUMMY
            for (int i = 0; i < 100 ; i++) {
                AuditoriaProtestos auditoria = new AuditoriaProtestos();
                auditoria.setUsuario("aaaaaaaaaaaaaaa");
                auditoria.setNombre("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
                auditoria.setCodCCosto(2020);
                auditoria.setGlosaCCosto("aaaaaaaaaaaaaaaaaaa");
                auditoria.setGlosaConsulta("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
                auditoria.setCantidad(i+1);
                result.add(auditoria);
            }*/
            
        }catch(Exception e) {
            e.printStackTrace();
        }finally{
            ConnectionFactory.freeConnection(con, rs);        
        }
        return result;
    }


    /**
     * @param fechaDesde
     * @param fechaHasta
     * @param codUsuario
     * @return
     */
    @Override
    public List<AuditoriaGlosaCantidad> getAuditoriaDetalle(Date fechaDesde, Date fechaHasta, String codUsuario) {

        if(fechaDesde == null ||
            codUsuario == null || 
           fechaHasta == null) {
               return Collections.emptyList();
        }

        Connection con = null;
        ResultSet rs = null;
        
        List<AuditoriaGlosaCantidad> result = new ArrayList<AuditoriaGlosaCantidad>();
        
        try {
            con = ConnectionFactory.getConnectionSybaseBIC();
            CallableStatement stm = con.prepareCall("{?=CALL SQ_DetalleConsulta2_VsNet(?,?,?,?)}");
            stm.registerOutParameter(1, Types.INTEGER);
            
            stm.setTimestamp(2, new Timestamp(fechaDesde.getTime()));
            stm.setTimestamp(3, new Timestamp(fechaHasta.getTime()));
            stm.setString(4, codUsuario);
            
            stm.registerOutParameter(5, Types.VARCHAR); //Fld_Mensaje
            
            rs = stm.executeQuery();
            
            while(rs.next()) {
                AuditoriaGlosaCantidad detalle = new AuditoriaGlosaCantidad();
                detalle.setCodConsulta(rs.getLong(1));
                detalle.setGlosaConsulta(rs.getString(2));
                detalle.setCantidadConsulta(rs.getInt(3));
                
                result.add(detalle);
            }
            
            
            /*DUMMY
            for(int i = 0; i < 5 ; i++) {
                RutNombre detalle = new RutNombre();
                detalle.setRut("1-9");
                detalle.setNombre("NOMBRE COMPLETO");
                result.add(detalle);
            }*/
            
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectionFactory.freeConnection(con);
        }
        return result;
    }

    /**
     * @param fechaDesde
     * @param fechaHasta
     * @param codUsuario
     * @param codConsulta
     * @return
     */
    @Override
    public List<RutNombre> getAuditoriaDetalleByCodConsulta(Date fechaDesde, Date fechaHasta, String codUsuario,
                                                            Integer codConsulta) {
        if(fechaDesde == null ||
           codUsuario == null || 
           fechaHasta == null ||
           codConsulta == null) {
               return Collections.emptyList();
        }

        Connection con = null;
        ResultSet rs = null;
        
        List<RutNombre> result = new ArrayList<RutNombre>();
        
        try {
            con = ConnectionFactory.getConnectionSybaseBIC();
            CallableStatement stm = con.prepareCall("{?=CALL SQ_DetConsAudit_VsNet(?,?,?,?,?)}");
            stm.registerOutParameter(1, Types.INTEGER);
            
            stm.setTimestamp(2, new Timestamp(fechaDesde.getTime()));
            stm.setTimestamp(3, new Timestamp(fechaHasta.getTime()));
            stm.setString(4, codUsuario);
            stm.setInt(5, codConsulta);
            
            stm.registerOutParameter(6, Types.VARCHAR); //Fld_Mensaje
            
            rs = stm.executeQuery();
            
            while(rs.next()) {
                RutNombre detalle = new RutNombre();
                detalle.setRut(rs.getString("Fld_RutConsultado"));
                detalle.setFecha(rs.getDate("Fld_Fecha"));
                if(Util.isRutJuridico(detalle.getRut())) {
                    detalle.setNombre(rs.getString("Fld_Nombre_ApPat") + 
                                      rs.getString("Fld_Nombre_ApMat") +
                                      rs.getString("Fld_Nombre_Nombres"));
                }else{
                    detalle.setNombre(rs.getString("Fld_Nombre_ApPat").trim() + " " + 
                                      rs.getString("Fld_Nombre_ApMat").trim() + " " +
                                      rs.getString("Fld_Nombre_Nombres").trim());
                }
                result.add(detalle);
            }
            
            
            /*DUMMY
            for(int i = 0; i < 5 ; i++) {
                RutNombre detalle = new RutNombre();
                detalle.setRut("1-9");
                detalle.setNombre("NOMBRE COMPLETO");
                result.add(detalle);
            }*/
            
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectionFactory.freeConnection(con);
        }
        return result;
    }
}
